package 利用反射机制访问类的属性以及方法;

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;


public class 利用反射访问类的公共部分结构 {
    /**
     * 利用反射的API，对Person的公共构造器进行操作
     */
    @Test
    public void Test1() throws Exception{
        //1.创建一个类的‘字节码文件’对象
        Class clazz=Person.class;
        //2.通过反射，创建Person类的对象。
            // 掉用getConstructor()方法返回一个‘类类型对象’的‘构造器对象’
        Constructor cons =clazz.getConstructor(String.class,int.class);//形参根据原本类的公共构造函数来自由确定
            //调用newInstance()方法来给构造器对象赋值
        Object obj = cons.newInstance("Jon",22);
            //再强制类型转换为person类类型
        Person p=(Person) obj;
        //2.打印输出到控制台
        System.out.println(p.toString());

    }

    @Test
    public void Test2() throws Exception {
        //1.创建一个‘类类型’对象
        Class clazz=Person.class;
        //2.通过反射，创建Person类的对象。掉用getConstructor()方法返回一个‘类类型对象’的‘构造器对象’
        Constructor cons =clazz.getConstructor(String.class,int.class);//形参根据原本类的公共构造函数来自由确定
        //3.调用newInstance()方法来给构造器对象赋值
        Object obj = cons.newInstance("lmf",22);
        //4.再强制类型转换为person类类型
        Person p=(Person) obj;
        System.out.println(p.toString());
        //5.通过反射，调用对象指定的属性和方法
        Field age = clazz.getDeclaredField("age");
        age.set(p,10);//设置属性值
        //5.打印输出到控制台
        System.out.println(p.toString());
    }
}
